import Vue from 'vue'

import {
    SpriteManager,
    Sprite,
    StandardMaterial,
    Texture
} from "@babylonjs/core"; // 按需引入
// import * as BABYLON from "@babylonjs/core/Legacy/legacy";// 全部引入

import {
    data
} from "./data.js"; // 模型的数据源

/* 
 * 模型的执行函数
 * scene   场景
 * key     公厕编号
 * resData 坑位数据
 * isCreateSprite 是否创建精灵图标
 */
function execution(scene, key, resData, isCreateSprite) {
    // console.log('模型的数据源：', data)
    console.log('坑位数据：', resData)

    // 整体box
    // var box = scene.getMeshByName('').parent.parent;

    console.log('所有坑位编号：', returnpPitNoArr(resData, 0))
    console.log('男卫坑位编号：', returnpPitNoArr(resData, 1))
    console.log('女卫坑位编号：', returnpPitNoArr(resData, 2))
    console.log('第三卫坑位编号：', returnpPitNoArr(resData, 3))

    // 创建精灵图标
    if (isCreateSprite && resData.length > 0) {
        /* 坑位类型 ============== start ============== */
        // 男卫-坑位类型 标志图标
        returnpPitNoArr(resData, 1) ? CreateSpriteIcon(
            scene,
            'male', {
                w: 66,
                h: 88
            },
            data[key].SpritePositions_male,
            1,
            ['001']
        ) : ''
        // 女卫-坑位类型 标志图标
        returnpPitNoArr(resData, 2) ? CreateSpriteIcon(
            scene,
            'female', {
                w: 66,
                h: 88
            },
            data[key].SpritePositions_female,
            1,
            ['001']
        ) : ''
        // 第三卫-坑位类型 标志图标
        returnpPitNoArr(resData, 3) ? CreateSpriteIcon(
            scene,
            'three', {
                w: 33,
                h: 44
            },
            data[key].SpritePositions_three,
            0.5,
            ['001']
        ) : ''
        /* 坑位类型 ============== end ============== */

        // alarm报警 标志图标
        returnpPitNoArr(resData, 0) ? CreateSpriteIcon(
            scene,
            'alarm', {
                w: 58,
                h: 72
            },
            data[key].SpritePositions_alarm,
            1,
            returnpPitNoArr(resData, 0)
        ) : ''

        // repair维修 标志图标
        returnpPitNoArr(resData, 0) ? CreateSpriteIcon(
            scene,
            'repair', {
                w: 58,
                h: 72
            },
            data[key].SpritePositions_status,
            1,
            returnpPitNoArr(resData, 0)
        ) : ''

        // Idle空闲 标志图标
        returnpPitNoArr(resData, 0) ? CreateSpriteIcon(
            scene,
            'Idle', {
                w: 58,
                h: 72
            },
            data[key].SpritePositions_status,
            1,
            returnpPitNoArr(resData, 0)
        ) : ''

        // occupy占用 标志图标
        returnpPitNoArr(resData, 0) ? CreateSpriteIcon(
            scene,
            'occupy', {
                w: 58,
                h: 72
            },
            data[key].SpritePositions_status,
            1,
            returnpPitNoArr(resData, 0)
        ) : ''

        // Not未安装设备 标志图标
        returnpPitNoArr(resData, 0) ? CreateSpriteIcon(
            scene,
            'Not', {
                w: 58,
                h: 72
            },
            data[key].SpritePositions_status,
            1,
            returnpPitNoArr(resData, 0)
        ) : ''
    }

    // 精灵图的显示与隐藏
    showHideSprite(scene, resData)
}

/* 
 * 返回男、女、第三卫的厕所编号
 * resData 坑位数据
 * type    公厕类型 0.全部 1.男厕 2.女厕 3.第三卫
 */
function returnpPitNoArr(resData, type) {
    let arr = [];
    resData.forEach(function (element) {
        if (!type) {
            arr.push(element.number)
        } else {
            if (element.type == type) {
                arr.push(element.number)
            }
        }
    });
    return arr.length == 0 ? null : arr;
}

/* 
 * 精灵图的显示与隐藏
 * resData 坑位数据
 * type    公厕类型 1.男厕 2.女厕 3.第三卫
 */
function showHideSprite(scene, resData) {
    if (!resData) {
        return;
    }
    let SpriteArr = [];
    if (scene.spriteManagers) {
        scene.spriteManagers.forEach(function (sprites) {
            sprites.children.forEach(function (sprite) {
                SpriteArr.push(sprite)
            });
        });
    }
    console.log('所有精灵图标集合：', SpriteArr);

    // number        坑位编号
    // type         公厕类型 1.男厕 2.女厕 3.第三卫
    // state        坑位状态：0.无人（空闲） 1.有人（占用） 2.故障（维修） 3.未安装（状态3暂时未启用）
    // alarmState   第三卫的报警状态：1:正常 2:报警
    let showSpriteArr = returnpPitNoArr(resData, 3) ? ['Sprite_male-001', 'Sprite_female-001', 'Sprite_three-001'] : ['Sprite_male-001', 'Sprite_female-001']; // 可以显示的精灵图标
    resData.forEach(function (element) {
        if (element.number) {
            let name = 'Sprite_' + ['Idle-', 'occupy-', 'repair-', 'Not-'][element.state] + element.number;
            showSpriteArr.push(name)
            if (element.alarmState == 2) {
                let name = 'Sprite_alarm-' + element.number;
                showSpriteArr.push(name)
            }
        }

    });
    console.log('可以显示的精灵图标：', showSpriteArr)
    SpriteArr.forEach(function (element) {
        if (showSpriteArr.indexOf(element.name) != -1) {
            element.isVisible = true;
        } else {
            element.isVisible = false;
        }
    });
}

/* 
 * 创建精灵图标 
 * scene
 * imgName          精灵图标名称
 * imgWH            精灵图标宽高
 * positions        图标位置信息配置
 * bs               精灵图标宽高的倍数
 * bhArr            编号数组
 */
function CreateSpriteIcon(
    scene, imgName, imgWH, positions, bs, bhArr
) {
    var SArr = []; // 模型精灵图集合
    var SM = new SpriteManager(
        "SpriteManager_" + imgName,
        window.serverConfig.resources+"/images/index/" + imgName + '.png',
        bhArr.length, {
            width: imgWH.w,
            height: imgWH.h
        },
        scene
    );
    positions.forEach(function (element, index) {
        let i = bhArr[index];
        var S = new Sprite("Sprite_" + imgName + '-' + i, SM);
        S.position.x = Number(element[0]);
        S.position.y = Number(element[1]);
        S.position.z = Number(element[2]);
        S.width = bs;
        S.height = bs;
        S.angle = Math.PI;
        S.invertU = true;
        S.invertV = true;
        S.isVisible = false;

        SArr.push(S)
    });

    return SArr;
}

/*
 * 自定义材质
 * meshId 需要自定义mesh的ID/name
 * scene  场景
 * png
 */
function CustomMaterial(scene, meshId, png) {
    var material = new StandardMaterial("material_" + meshId, scene);
    material.diffuseTexture = new Texture(png) // 贴纹理
    scene.getMeshByName(meshId).material = material; // Place the material property of the [meshId]
}

export {
    execution,
    CreateSpriteIcon,
    CustomMaterial,
    returnpPitNoArr,
    showHideSprite
};